

String OUTPUTPATH = "test2.txt";

//String path = "/Users/Veketor/Documents/partido2/framesPNG/IMG_";
String path = "/Volumes/Linux/TENIS/framesPNG/IMG_";
String FileExtension = ".png";
String file="";
String[] tGolpe = new String[] {
  "Saque", "Suelo", "Raqueta", "Red", "PuntoA", "PuntoB"
};
//                                0        1          2        3       4          5


/////////////////////////////////////////////////////////////////////////////////
//           Logica del tenis
ArrayList<Golpe> golpes;
Partido          partido;
ArrayList<Curva> curvas;

int editando;
Curva curvaEnEdicion;

boolean multiple = false;

boolean select = false;
int[] sel1;
int[] sel2;
ArrayList<Curva> candidatos;


////////////////////////////////////////////////////////////////////////////////
//           SETUP
void setup() {
  size(4096, 768);

  /// inicializa la logica
  golpes  = new ArrayList<Golpe>();
  partido = new Partido();
  curvas  = new ArrayList<Curva>();
  candidatos = new ArrayList<Curva>();

  editando = 0;

  // for each trayectoriy, setup a spline
  for (int i = 0; i < partido.puntos.size(); i++) {
    for (int j = 0; j < partido.puntos.get(i).trayectorias.size(); j++) {    
      Trayectoria tr = partido.getTrayectoria(i, j);
      Curva c;      
      c = new Curva (0, 0, width, height/2);
      c.setCurva (tr);
      curvas.add(c);
    }
  }
  curvaEnEdicion = curvas.get(editando);

  // selection things
  sel1 = new int[2];
  sel2 = new int[2];
}

///////////////////////////////////////////////////////////////////////
//           DRAW
void draw() {

  background(255);    
  
  stroke(255,0,0);
  line (0, height/2, width, height/2);

  for (int i = 0; i < curvas.size(); i++) {
    if (multiple) {
      //      curvas.get(i).edita(false);
    }
    else {
      if (i == editando) {
        curvaEnEdicion.edita(false);
        curvaEnEdicion = curvas.get(i);
        curvaEnEdicion.edita(true);
      }
    }

    curvas.get(i).draw();
  }

  if (select) {
    noFill();
    rect(sel1[0],sel1[1],sel2[0],sel2[1]) ;
  }
}


////////////////////////////////////////////////////////////////////////
int getTipoByString (String a) {
  for (int i=0; i < tGolpe.length; i++)
    if (tGolpe[i].equals(a))
      return i;  
  return -1;
}

////////////////////////////////////////////////////////////////////////
void keyReleased() {
  if (key == CODED) {
    switch (keyCode) {
    case RIGHT:
      editando ++;
      break;
    case LEFT:
      if (editando !=0)
        editando --;
      break;

    case UP:
      moveUp(0.001);
      break;

    case DOWN:
      moveDown(0.001);
      break;
    }
  }
  else
    switch(key) {
    case ' ':
      println ("modo seleccion multiple " + toggleSelect());
      break;
    }
}

////////////////////////////////////////////////////////////////////////
void mousePressed() {
  if (multiple) {
    sel1[0] = mouseX;
    sel1[1] = mouseY;    
    sel2[0] = sel2[1] = 0;
    select = true;
    
    for (int i = 0; i < candidatos.size(); i++) 
      candidatos.get(i).edita(false);
      
    candidatos.clear();
  }
  else {
    curvaEnEdicion.mouseOver();
  }
}

////////////////////////////////////////////////////////////////////////
void mouseDragged() {
  if (multiple) {
    sel2[0] = mouseX;
    sel2[1] = mouseY;

    for (int i = 0; i < curvas.size(); i++) {  // si estan en rago, es un candidato
      Curva c = curvas.get(i);
      int []coord  = c.getPuntoVcoordenadasPantalla();
      if ((coord[0] > sel1[0]) && (coord[0] < sel2[0]) &&
        (coord[1] > sel1[1]) && (coord[1] < sel2[1])) {
        candidatos.add(c);
        c.edita(true);
      }
    }

    sel2[0] = sel2[0] - sel1[0];
    sel2[1] = sel2[1] - sel1[1];
  }
  else {
    curvaEnEdicion.drag();
  }
}

////////////////////////////////////////////////////////////////////////
void mouseReleased() {
  if (multiple) {
    select = false;
  }
  else {
    curvaEnEdicion.terminaDeArrastrar();
  }
}

////////////////////////////////////////////////////////////////////////
boolean toggleSelect() {

  for (int i = 0; i < curvas.size(); i++) 
    curvas.get(i).edita(false);

  candidatos.clear();

  return multiple= !multiple;
}

////////////////////////////////////////////////////////////////////////
void moveUp(float delta) {
  if (multiple) {
    for (int i = 0; i < candidatos.size(); i++) 
      candidatos.get(i).getPuntoV().y += delta;
  }
}

////////////////////////////////////////////////////////////////////////
void moveDown(float delta) {
  if (multiple) {
    for (int i = 0; i < candidatos.size(); i++) 
      candidatos.get(i).getPuntoV().y -= delta;
  }
}

String int2Frame(int frame) {
  int nFrame=frame;
  int cuanto=5;
  String salida="";
  while (nFrame>9 && cuanto>0) {
    nFrame=int(nFrame/10);
    cuanto=cuanto-1;
  }
  for (int i=0; i<cuanto; i++) {
    salida="0"+salida;
  }
  return salida+frame;
}
